﻿// Inner Fire 游戏引擎库
// 游戏时间类
//
// Copyright (c) 2024 by 尔西大帝. All rights reserved.
//
// 这个类用于管理游戏时间与帧数。
//
// Author: 尔西大帝
// Email: 2670613871@qq.com
// Created: 2024-11-15

#pragma once

namespace ifire::game {

constexpr float DEFAULT_FPS = 60.0f;
constexpr float DEFAULT_FRAME_TIME = 1.0f / DEFAULT_FPS;

/*
 * 这里面是龙书的类。用起来不方便。之后我会用自已的类。
 */
class Timer {
public:
  Timer();

  float TotalTime() const; // in seconds
  float DeltaTime() const; // in seconds

  // 用于检查指定帧是否能够执行FixedUpdate。如果可以，返回TRUE。并且重置当前帧的
  bool CheckFixedUpdate();
  void Reset(); // Call before message loop.
  void Start(); // Call when unpaused.
  void Stop();  // Call when paused.
  void Tick();  // Call every frame.
  // 计算FPS，并且返回FPS是否已经刷新
  bool CalculateFps();
  const char* GetFpsFormat(const char* format);
  float GetFps() const { return fps_; }

public:
  // fixedUpdate需要的时间，这个命名规则和Google不一样，但是和Unity统一。用惯了。
  float fixedDeltaTime;
  // 每帧的时间
  float deltaTime;

private:
  float frame_remain_;
  double last_frame_tick_;

  double seconds_per_count_;
  double delta_time_;

  __int64 base_time_;
  __int64 paused_time_;
  __int64 stop_time_;
  __int64 prev_time_;
  __int64 current_time_;

  bool is_stopped_;

  int frame_count_ = 0;
  float time_elapsed = 0.0f;
  float fps_ = 0.0f;

  char fps_text[256];
};

// 用于全局读取
extern Timer g_timer;

} // namespace ifire
